// 基础控件的传值方式
// 一个组件对应多个字段的情况
// import rangeRef from './ref-model-range'
// 直接读写 model
// 不防抖
import modelRef from './ref-model'
// 防抖
import modelDebounceRef from './ref-model-debounce'
// 多字段
import modelRangeRef from './ref-model-range'

// 使用emit，不支持多字段
// 不防抖
import emitRef from './ref-emit'
// 防抖
import emitDebounceRef from './ref-emit-debounce'

import type { IEventDebounce } from '../types/20-form-item'

interface IProps {
  model: any,
  colName: string | number,
  delay: number,
  modelValue: any
}

/**
 * 表单子控件的控制函数
 * @param props 组件的 props
 * @param emit 组件的 emit
 * @returns 
 */
export default function itemController<T extends IProps, U> (
  props: T,
  emit: (event: U, ...args: any[]) => void,
  // emit: (name: string, val: T[K]) => void,
  events?: any
) {

  // 从 props 里面获取属性
  const {
    model,
    colName,
    delay
  } = props
  
  // 防抖的相关事件 =================================
  const ctlEvents: IEventDebounce = {
    run: () => {}, // 立即执行，不防抖了
    clear: () => {} // 清除上一次计时，用于输入汉字的情况。
  }

  // 不防抖，立即提交
  const run = () => {
    ctlEvents.run() // 立即执行
  }
  // 输入汉字的情况
  const clear = (e: any) => {
    if (e.key !== 'Backspace') {
      ctlEvents.clear() // 输入汉字时清除上次计时
    }
  }

  // 父子组件传值的中转站，根据需求调用对应的函数。=================================
  let value: any

  // 判断 是否使用 model
  if (model) {
    // 判断是否多字段
    let isMoreColumn = false

    let tmpArrayColName: Array<string> = [] // 拆分后的字段名称
    if (typeof colName === 'string') {
      tmpArrayColName = colName.split('_')
      // 需要支持多个字段
      isMoreColumn = (tmpArrayColName.length > 1)
    }

    // 判断多字段（无防抖）
    if (isMoreColumn && tmpArrayColName) {
      value = modelRangeRef(model, tmpArrayColName) // 支持多字段，不防抖
      // value = modelRangeRef(model, ...tmpArrayColName) // 支持多字段，不防抖
    } else {
      // 判断防抖
      if (delay > 0) {
        // 需要防抖
        value = modelDebounceRef(model, colName, ctlEvents, delay)
      } else {
        // 不需要防抖
        value = modelRef(model, colName)
        // value = model[colName]
      }
    }
  } else {
    // emit
    if (delay > 0) {
      // 需要防抖
        value = emitDebounceRef(props, emit, 'modelValue', ctlEvents, delay)
      } else {
      // 不需要防抖
      value = emitRef(props, emit, 'modelValue')
    }
  }

  return {
    value,
    run,
    clear
  }
}
